// 引入必要头文件
#include <ros/ros.h> // ROS基础功能头文件
#include <actionlib/client/simple_action_client.h> // 动作客户端库
#include <action_communication/setarpAction.h> // 自定义动作消息类型头文件

// 动作完成回调函数
void done_cb(const actionlib::SimpleClientGoalState &state, 
            const action_communication::setarpResultConstPtr &result)
{
    // 根据最终状态处理结果
    if(state.state_ == state.SUCCEEDED) // 动作成功完成
    {
        if(result->result) // 解析最终结果布尔值
        {
            std::cout << "检测完成" << std::endl;
        }
        else
        {
            std::cout << "未检测完成" << std::endl;
        }
    }
    else // 其他状态（ABORTED/PREEMPTED等）
    {
        std::cout << "响应失败" << std::endl;
    }
}

// 连接激活回调函数（当服务器接受目标时触发）
void action_cb()
{
    std::cout<< "开始检测" << std::endl;
}

// 进度反馈回调函数（周期接收服务器反馈）
void feedback_cb(const action_communication::setarpFeedbackConstPtr &feedback)
{
    std::cout << "当前进度" << feedback->progress_bar << "%" << std::endl;
}

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, ""); // 设置本地化支持中文输出

    // ROS节点初始化
    ros::init(argc, argv, "client_action"); // 节点名client_action
    ros::NodeHandle nh;

    // 创建动作客户端（模板参数为动作类型）
    actionlib::SimpleActionClient<action_communication::setarpAction> client(nh, "action");
    
    // 等待服务器上线（阻塞式等待）
    client.waitForServer();

    // 创建目标请求对象
    action_communication::setarpGoal goal;
    goal.goal = 100; // 设置目标值为100个零件
    
    // 发送目标请求（绑定三个回调函数）
    client.sendGoal(goal, 
                  &done_cb,    // 完成回调
                  &action_cb,  // 连接激活回调
                  &feedback_cb // 进度反馈回调
                  );

    ros::spin();  // 进入事件循环，保持节点运行接收反馈
    return 0;
}